//
//  TSCMyTextView.m
//  Tsc_IOS
//
//  Created by Rio on 15-10-17.
//  Copyright (c) 2015年 idream. All rights reserved.
//
//

#import "TSCMyTextView.h"
#import "TSCSDK.h"

@implementation TSCMyTextView {
    
    UITextView * _tvPlaceholder; // 用来显示hint的tv，因不需要暴露给外部使用者，故声明为私有变量
    
    TSCMyTextViewDelegate * _myTextViewDelegate; // 监听<UITextViewDelegate>的代理（注：不能用self作为代理）
}

- (id) init {
    self = [super init];
    if (self) {
        [self initializeMyTextView];
    }
    return self;
}

- (id) initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self initializeMyTextView];
    }
    return self;
}

- (id) initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self initializeMyTextView];
    }
    return self;
}

- (void) initializeMyTextView {
    // 初始化自定义类属性
    _placeholder = @"";
    
    // 设置自身属性
    self.font = [TSCMyUIUtil getSystemDefaultFont]; // 系统默认字体
    self.backgroundColor = [UIColor clearColor]; // 为了能让_tvPlaceholder露出来，将自身的背景色取消
    
    // 设置自身代理
    //    self.delegate = self; // 单播代理，已废弃，使用多播代理
    //    [self.multicastDelegate addDelegate:self]; // 多播代理。注：不能这样写，原因请参看.h文件顶部说明
    _myTextViewDelegate = [[TSCMyTextViewDelegate alloc]init];
    _myTextViewDelegate.myTextView = self;
    [self.multicastDelegate addDelegate:_myTextViewDelegate];
    
    // 添加border
    [TSCMyUIUtil setUIRoundBorder:self radius:5.0f borderColor:COLOR_MT_BORDER_LIGHT_GRAY borderWidth:1.0f];
    
    // 构造用来显示placeholder的tv
    _tvPlaceholder = [[UITextView alloc]init];
    _tvPlaceholder.userInteractionEnabled = NO; // 禁止用户交互
    _tvPlaceholder.font = self.font; // 系统默认字体（颜色除外，下面重置颜色）
    _tvPlaceholder.textColor = COLOR_MT_PLACEHOLDER;
    _tvPlaceholder.hidden = NO;
    // 注：将_tvPlaceholder的添加到superview、设置_tvPlaceholder的约束等等，这些逻辑需要延迟到self已经被添加到superview之后再进行
}

#pragma mark UIView delegate
- (void) didMoveToSuperview {
    // 注：当self被添加到superview后，才能设置约束
    // 注：当当前vc被销毁时，该方法也会被调用，只不过superview是nil，所以要进行判断
    
    if (self.superview) {
        [self.superview addSubview:_tvPlaceholder];
        [self.superview insertSubview:_tvPlaceholder belowSubview:self]; // 将_tvPlaceholder移动到self下一层
        
        // 约束
        // _tvPlaceholder
        _tvPlaceholder.translatesAutoresizingMaskIntoConstraints = NO;
        [NSLayoutConstraint constraintWithItem:_tvPlaceholder attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f].active = YES;
        [NSLayoutConstraint constraintWithItem:_tvPlaceholder attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0f constant:0.0f].active = YES;
        [NSLayoutConstraint constraintWithItem:_tvPlaceholder attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f].active = YES;
        [NSLayoutConstraint constraintWithItem:_tvPlaceholder attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f].active = YES;
    }
}



//#pragma mark UITextView delegate
//// 注：只有当下述情况，textViewDidChange()才会被调起：
//// 1. 通过界面键盘输入/删除
//// 注：下述情况，该方法不会被调起：
//// 1. 粘贴
//// 2. 代码设置text
//- (void) textViewDidChange:(UITextView *)textView {
//    // 没有内容，显示placeholder
//    //    if ([TSCMyUtil isStringEmpty:self.text]) {
//    if (self.text.length == 0) {
//        _tvPlaceholder.hidden = NO;
//    }
//    // 有内容，隐藏placeholder
//    else {
//        _tvPlaceholder.hidden = YES;
//    }
//}


#pragma mark Getters & Setter
- (void) setPlaceholder:(NSString *)placeholder {
    // 当设置placeholder时，改变tv的text
    _tvPlaceholder.text = placeholder;
}

- (void) setFont:(UIFont *)font {
    [super setFont:font];
    
    // 更新_tvPlaceholder的字体，但除颜色以外
    _tvPlaceholder.font = font;
    _tvPlaceholder.textColor = COLOR_MT_PLACEHOLDER;
}

- (void) setText:(NSString *)text {
    [super setText:text];
    
    // 因为通过代码直接设置self.text，将无法自动触发textViewDidChange()，所以在这里手工触发一下
    //    [self textViewDidChange:self]; // 单播代理，已废弃，使用多播代理
    [_myTextViewDelegate textViewDidChange:self];
}

- (void) setPlaceholderTextViewHidden:(BOOL)hidden {
    _tvPlaceholder.hidden = hidden;
}

@end


// 为避免将UITextView自身（self）设置为<UITextViewDelegate>，需要单独提供一个“内部类”，对代理事件进行监听
@implementation TSCMyTextViewDelegate

// 注：只有当下述情况，textViewDidChange()才会被调起：
// 1. 通过界面键盘输入/删除
// 注：下述情况，该方法不会被调起：
// 1. 粘贴
// 2. 代码设置text
- (void) textViewDidChange:(UITextView *)textView {
    // 没有内容，显示placeholder
    //    if ([TSCMyUtil isStringEmpty:self.text]) {
    if (_myTextView.text.length == 0) {
        [_myTextView setPlaceholderTextViewHidden:NO];
    }
    // 有内容，隐藏placeholder
    else {
        [_myTextView setPlaceholderTextViewHidden:YES];
    }
}

@end
